package com.yyfax.ph.common.utils.preferenceutils;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.v4.content.SharedPreferencesCompat;
import android.text.TextUtils;

import com.yyfax.infrastructure.store.sharedpreferences.SecuredPreference;

import java.util.HashMap;
import java.util.Map;


/**
 * SharePreference缓存管理
 * 保存缓存使用通用方法 {@link #savePreference(String, Object)}
 * 获取缓存的方法一对一区分开，防止误操作。
 * 缓存key必须在{@link PreferenceConstants#SP_KEY_USER_NAME}统一配置。
 * @author ying_he
 * @date 2017/3/14 15:34
 */
public class PreferenceManager {
    private static final String OLD_SP_FILE_NAME = "SHARE_DATA";

    private static final String VERSION = "20170318";
    private static final String SP_FILE_NAME = "CMA_PREFS" + "_" + VERSION;
    private static final String SP_ENCRYPT_PWD = "";

    // 旧版数据
    private SharedPreferences mOldPreference;
    private SharedPreferences mPreference;
    // 缓存已使用过的Value，减少重复查找操作。
    private Map<String, Object> mCacheGeneratedValue = new HashMap<>();

    public PreferenceManager(Context context){
        // 兼容旧版升级新版数据
        mOldPreference = context.getSharedPreferences(OLD_SP_FILE_NAME,Context.MODE_PRIVATE);
        try {
            mPreference = new SecuredPreference(context.getApplicationContext(), SP_ENCRYPT_PWD, SP_FILE_NAME);
        } catch (Exception e) {
            mPreference = SecuredPreference.useAndroidSharedPreference(context.getApplicationContext(), SP_FILE_NAME);
        }
    }

    /**
     * 存缓存,统一存为String
     * 仅允许存储String，基本数据类型，JSONObject，JSONArray。序列化对象、文件缓存、或者复杂JSON字串存储，请使用{@link com.yyfax.common.lockpattern.ACache.ACacheManager}
     * @param key 所有缓存的key需统一在{@link PreferenceConstants#SP_KEY_USER_NAME}中配置，在使用中key不允许出现硬编码。
     * @param value
     */
    public PreferenceManager savePreference(String key, Object value) {
        if (value == null){
            return this;
        }
        if (!mCacheGeneratedValue.containsKey(key) || !mCacheGeneratedValue.get(key).equals(value)){
            SharedPreferences.Editor editor = mPreference.edit();
            editor.putString(key, String.valueOf(value));
            SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
            mCacheGeneratedValue.put(key, value);
        }
        return this;
    }

    /**
     * @param key 所有缓存的key需统一在{@link PreferenceConstants#SP_KEY_USER_NAME}中配置，在使用中key不允许出现硬编码。
     */
    public PreferenceManager remove(String key){
        SharedPreferences.Editor editor = mPreference.edit();
        editor.remove(key);
        SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
        mCacheGeneratedValue.remove(key);
        return this;
    }

    public void clear(){
        SharedPreferences.Editor editor= mPreference.edit();
        editor.clear();
        SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
        mCacheGeneratedValue.clear();
    }

    /**
     * @param key 所有缓存的key需统一在{@link PreferenceConstants#SP_KEY_USER_NAME}中配置，在使用中key不允许出现硬编码。
     */
    private String optString(String key, String defaultValue){
        String value;
        if (mCacheGeneratedValue.containsKey(key)) {
            value = String.valueOf(mCacheGeneratedValue.get(key));
        }else {
            value = mPreference.getString(key, defaultValue);
            mCacheGeneratedValue.put(key, value);
        }
        return value;
    }

    /**
     * @param key 所有缓存的key需统一在{@link PreferenceConstants#SP_KEY_USER_NAME}中配置，在使用中key不允许出现硬编码。
     */
    private float optFloat(String key, float defaultValue){
        float value;
        if (mCacheGeneratedValue.containsKey(key)) {
            value = Float.valueOf(String.valueOf(mCacheGeneratedValue.get(key)));
        }else {
            value = mPreference.getFloat(key, defaultValue);
            mCacheGeneratedValue.put(key, value);
        }
        return value;
    }

    /**
     * @param key 所有缓存的key需统一在{@link PreferenceConstants#SP_KEY_USER_NAME}中配置，在使用中key不允许出现硬编码。
     */
    private long optLong(String key, long defaultValue){
        long value;
        if (mCacheGeneratedValue.containsKey(key)) {
            value = Long.valueOf(String.valueOf(mCacheGeneratedValue.get(key)));
        }else {
            value = mPreference.getLong(key, defaultValue);
            mCacheGeneratedValue.put(key, value);
        }
        return value;
    }

    /**
     * @param key 所有缓存的key需统一在{@link PreferenceConstants#SP_KEY_USER_NAME}中配置，在使用中key不允许出现硬编码。
     */
    private int optInt(String key, int defaultValue){
        int value;
        if (mCacheGeneratedValue.containsKey(key)) {
            value = Integer.valueOf(String.valueOf(mCacheGeneratedValue.get(key)));
        }else {
            value = mPreference.getInt(key, defaultValue);
            mCacheGeneratedValue.put(key, value);
        }
        return value;
    }

    /**
     * @param key 所有缓存的key需统一在{@link PreferenceConstants#SP_KEY_USER_NAME}中配置，在使用中key不允许出现硬编码。
     */
    private boolean optBoolean(String key, boolean defaultValue){
        boolean value;
        if (mCacheGeneratedValue.containsKey(key)) {
            value = Boolean.valueOf(String.valueOf(mCacheGeneratedValue.get(key)));
        }else {
            value = mPreference.getBoolean(key, defaultValue);
            mCacheGeneratedValue.put(key, value);
        }
        return value;
    }
	/** 获取app版本号 */
	public int getAppVersion(int defaultValue){
		return optInt(PreferenceConstants.SP_KEY_APP_VERSION, defaultValue);
	}

    public String getUserId(String defaultValue){
        return optString(PreferenceConstants.SP_KEY_USER_ID, defaultValue);
    }

    /** 获取是否首次启动app */
    public boolean isFirstStartApp(boolean defaultValue){
        return optBoolean(PreferenceConstants.SP_KEY_FIRST_FLAG, defaultValue);
    }

    public boolean isFirstLogin(boolean defaultValue){
        return optBoolean(PreferenceConstants.SP_KEY_FIRST_LOGIN, defaultValue);
    }

    public boolean isEnablePatternLock(){
        return optBoolean(PreferenceConstants.SP_KEY_GESTURES_TOGGLE, false);
    }

    public String getPatternLock(){
        return optString(PreferenceConstants.SP_KEY_GESTURES_STRING, "");
    }

    // 手势密码解锁失败次数
    public int getUnlockFailedTimes(){
        return optInt(PreferenceConstants.SP_KEY_GESTURES_COUNT, 0);
    }

    public String getLoginToken(){
        return optString(PreferenceConstants.SP_KEY_LOGIN_TOKEN_FLAG, "");
    }

	/**
	 * 获取用户名
	 * @return
	 */
	public String getUserName(){
		return optString(PreferenceConstants.SP_KEY_USER_NAME, "");
	}

    public String getUserPhone(){
        String userPhone = optString(PreferenceConstants.SP_KEY_USER_PHONE, "");
        if (!isFirstLoginSuccess() && TextUtils.isEmpty(userPhone)){
            // 兼容旧版升级新版
            userPhone = mOldPreference.getString(PreferenceConstants.SP_KEY_USER_PHONE, "");
            if (!TextUtils.isEmpty(userPhone)) {
                savePreference(PreferenceConstants.SP_KEY_USER_PHONE, userPhone);
            }
        }
        return userPhone;
    }

    public boolean isLoginSuccess(){
        return optBoolean(PreferenceConstants.SP_KEY_LOGIN_SUCCESS_FLAG, false);
    }

	public boolean isBindJPush(){
		return optBoolean(PreferenceConstants.SP_KEY_BIND_JPUSH_FLAG, false);
	}

	public boolean isNeedValidateGesture() {
		return optBoolean(PreferenceConstants.SP_KEY_VALIDATE_GESTURE, false);
	}

    public int getRecommendFailedIndex(int defaultValue){
        return optInt(PreferenceConstants.SP_KEY_RECOMMEND_FAILED_INDEX, defaultValue);
    }

    public int getRecommendBiz(int defaultValue){
        return optInt(PreferenceConstants.SP_KEY_RECOMMEND_BUSINESS, defaultValue);
    }

    public long getLastCancelUpdateTime(long defaultValue){
        return optLong(PreferenceConstants.SP_KEY_LAST_CANCEL_UPDATE_TIME_FLAG, defaultValue);
    }

    public int getCanRecommendFlag(int defaultValue){
        return optInt(PreferenceConstants.SP_KEY_CAN_RECOMMEND_FLAG, defaultValue);
    }

    public int getUserRecommendFlag(int defaultValue){
        return optInt(PreferenceConstants.SP_KEY_USER_RECOMMEND_FLAG, defaultValue);
    }

    public boolean isNormalExit(){
        return optBoolean(PreferenceConstants.SP_KEY_RECOMMEND_RESULT_FLAG, true);
    }

    public String getJPushRegId(){
        return optString(PreferenceConstants.SP_KEY_J_PUSH_REGISTER_ID, "");
    }

    public int getUnreadMsgCount(){
        return optInt(PreferenceConstants.SP_KEY_UNREAD_PUSH_MESSAGE_COUNT, 0);
    }

    public boolean isFirstLoginSuccess(){
        return optBoolean(PreferenceConstants.SP_KEY_FIRST_LOGIN_FLAG, false);
    }

    public int getUserType(int defaultValue){
        return optInt(PreferenceConstants.SP_KEY_USER_TYPE, defaultValue);
    }

    public String getLastShowedNoticeId(){
        return optString(PreferenceConstants.SP_KEY_LAST_SHOWED_NOTICE_ID, "");
    }

    public String getRecommendBizType(){
        return optString(PreferenceConstants.SP_KEY_RECOMMEND_BUSINESS_TYPE, "");
    }

    // 以下新增自2017/03/18
    /**
     * 是否已设置隐藏金额
     * @return
     */
    public boolean isHiddenMoneyAmount(){
        return optBoolean(PreferenceConstants.SP_KEY_HIDDEN_MONEY_AMOUNT, false);
    }


}
